home *** CD-ROM | disk | FTP | other *** search
- /*
- Terminal 2.2
- "File.c"
- */
-
- #include "Compatibility.h"
- #include "File.h"
- #include "Interp.h"
-
- /* ----- Static data --------------------------------------------------- */
-
- static jmp_buf env;
- int ScriptRef; /* Script file reference */
- static short ScriptUnget; /* Script file unget buffer */
- static Byte *ScriptBuffer; /* Script file buffer */
- static long ScriptEob; /* Size of script file buffer */
- static long ScriptMark; /* Next position in script file buffer */
- extern INTRINSIC Intrinsics[]; /* Script intrinsic functions */
-
-
-
- /* ----- Get text file name and execute script ------------------------- */
-
- #define SCRIPTSIZE 512 /* Script file buffer size */
- #define SCRIPTMAX 16384 /* Memory size for script */
-
- static Boolean Script(void)
- {
- register short err;
- register Boolean quit = FALSE;
-
- ScriptBuffer = 0;
- if (!(ScriptBuffer = (Byte *)malloc(SCRIPTSIZE + SCRIPTMAX))) {
- err = Mem_Error();
- goto done;
- }
- ScriptUnget = -1; /* No unget character yet */
- ScriptMark = ScriptEob = SCRIPTSIZE; /* Buffer is still empty */
-
- if (setjmp(env) == 0) {
- SI_Load(Intrinsics, ScriptBuffer + SCRIPTSIZE, SCRIPTMAX);
- close(ScriptRef); /* Script file no longer needed */
- err = SI_Interpret(); /* Call main() in script */
- } else { /* Come here after error */
- err = 1; /* Always restore settings if error */
- Sys_Beep(1);
- }
- /*
- The script main() can return the following values:
- 0 : Don't restore saved settings, continue application
- 1 : Restore saved settings, continue application
- 256 : Don't restore saved settings, quit application
- 257 : Restore saved settings, quit application
- */
- if (err == 1 || err == 257) { /* Restore settings */
- }
- if (err == 256 || err == 257) /* Quit application */
- quit = TRUE;
- err = noErr;
-
- done:
- if (ScriptBuffer)
- free((char *)ScriptBuffer);
- if (ScriptRef)
- close(ScriptRef);
- if (err) {
- Sys_Beep(1);
- }
- return quit;
- }
-
- static Boolean ScriptFlag = 0;
-
- Boolean RunScript(
- Byte *name
- )
- {
- register short err;
- register Byte *n;
- register Boolean quit = FALSE;
-
- if (name) {
- ScriptRef = open((char *)name, 0);
- }
- else {
- printf("File name? ");
- gets((char *)name);
- ScriptRef = open((char *)name, 0);
- }
- quit = Script();
-
- return quit;
- }
-
-
- /* ----- Functions called by interpreter ------------------------------- */
-
- void SI_Error(
- register short erno,
- register Byte *s,
- register short line)
- {
- register Byte message[256];
-
- /*erno += 2;*/
- if (*s) {
- printf("ERROR #%d: Line %d: %s\n", erno, line, s);
- } else
- printf("ERROR #%d: Line %d\n", erno, line);
-
- longjmp(env, 0); /* Return to Script(), ignore link chain */
- }
-
- Byte SI_GetSource(void)
- {
- register Byte c;
- if (ScriptUnget >= 0) { /* The was a previous unget */
- c = ScriptUnget; /* So use the unget buffer */
- ScriptUnget = -1; /* Unget buffer is empty now */
- return c;
- }
- if (ScriptMark < ScriptEob) { /* Can still use buffer */
- c = ScriptBuffer[ScriptMark++];
- return c;
- }
- if (ScriptEob < SCRIPTSIZE) /* Was last (partial) buffer */
- return -1; /* EOF */
- ScriptEob = SCRIPTSIZE; /* Read next buffer from file */
- ScriptEob = read(ScriptRef, (char *)ScriptBuffer, ScriptEob);
- if (ScriptEob > 0) { /* Ok, at least one character */
- ScriptMark = 0;
- return SI_GetSource();
- }
- return -1; /* Error or end of file */
- }
-
- void SI_UngetSource(register Byte c)
- {
- ScriptUnget = c; /* That's easy */
- }
-
-